home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 008 / readmac4.arc / READMAC!.ASM next >
Encoding:
Assembly Source File  |  1987-02-13  |  38.0 KB  |  1,003 lines

  1. PAGE ,132
  2. TITLE ReadMac - View Macintosh Pictures on an IBM/PC (CGA or Hercules)
  3.  
  4. COORD     MACRO   REG,ROW,COL
  5.           MOV     REG,(ROW*256)+COL
  6.           ENDM
  7.  
  8. CONFIG    MACRO   VAL
  9.           MOV     AL,VAL
  10.           MOV     DX,3BFH
  11.           OUT     DX,AL
  12.           ENDM
  13.  
  14. SCROLL    EQU     10
  15.  
  16. HOME      EQU     71
  17. UPARROW   EQU     72
  18. PAGEUP    EQU     73
  19. ENDKEY    EQU     79
  20. DNARROW   EQU     80
  21. PAGEDN    EQU     81
  22. CPRTSC    EQU     114
  23. CEND      EQU     117
  24. CPAGEDN   EQU     118
  25. CHOME     EQU     119
  26. CPAGEUP   EQU     132
  27.  
  28. BUFFER    EQU     IOBUF[8192]
  29.  
  30. BIOS      SEGMENT AT 40H
  31.           ORG     65H
  32. CRTMODE   LABEL   BYTE
  33. BIOS      ENDS
  34.  
  35. CODE      SEGMENT
  36.  
  37.           ASSUME  CS:CODE,DS:CODE
  38.  
  39.           ORG     80H
  40.  
  41. PARAM     LABEL   BYTE
  42.  
  43.           ORG     100H
  44.  
  45. START:    JMP     MAIN
  46.  
  47. MENU      DB      "Micro Technologies, Inc.   Modified by SMG Software",13,10
  48.           DB      "921 Royal Heights Road                 Anaheim, CA",13,10
  49.           DB      "Belleville, IL  62223                  13-Feb-1987",13,10
  50.           DB      "  Voice: (618) 233-2314  Data: (618) 233-2315",13,10,10
  51.           DB      "       ",18H," Moves picture UP one pixel row",13,10
  52.           DB      "    PgUp Moves picture UP ten pixel rows",13,10
  53.           DB      "   ^PgUp Moves picture UP by a Half-Screen",13,10
  54.           DB      "       ",19H," Moves picture DOWN one pixel row",13,10
  55.           DB      "    PgDn Moves picture DOWN ten pixel rows",13,10
  56.           DB      "   ^PgDn Moves picture DOWN by a Half-Screen",13,10
  57.           DB      "   ^Home Scroll to Top of Picture",13,10
  58.           DB      "    ^End Scroll to Bottom of Picture",13,10
  59.           DB      "    Home Jump to Top of Picture",13,10
  60.           DB      "     End Jump to Bottom of Picture",13,10
  61.           DB      "    ^U,U Select printer",13,10
  62.           DB      "    ^O,O Install OTHER printer",13,10
  63.           DB      " ^P,^Q,P Select printer/Print picture",13,10
  64.           DB      "  ^PrtSc Print Picture",13,10
  65.           DB      "   L,H,? Load another picture",13,10
  66.           DB      "^E,E,Esc Return to DOS",13,10,10
  67.           DB      "Enter a quote (",34,") to view last picture",13,10,10
  68.           DB      "File name: $"
  69.  
  70. ERR_MSG   DB      13,10,"Non-graphics card found!",7,13,10,"$"
  71. LOAD_MSG  DB      13,10,"Loading Picture: $"
  72. LOAD_ERR  DB      13,10,"Unable to load "
  73. FILN_STR  DB      81 DUP(0)
  74.  
  75. GMODE     DB      35H,2DH,2EH,07H
  76.           DB      5BH,02H,57H,57H
  77.           DB      02H,03H,00H,00H
  78.  
  79. TMODE     DB      61H,50H,52H,0FH
  80.           DB      19H,06H,19H,19H
  81.           DB      02H,0DH,0BH,0CH
  82.  
  83. FILENAME  LABEL   BYTE
  84.           DB      80
  85. FILN_LEN  DB      0
  86. FILN_BUF  DB      81 DUP(0)
  87.  
  88. SCANCNT   DB      2                             ; Defaults for the CGA
  89. LINLEN    DW      640
  90. SCRLEN    DW      200
  91. VIDEO     DW      0B800H
  92. LASTSCAN  DW      ?
  93.  
  94. HERC      DB      1
  95. HANDLE    DW      0
  96.  
  97. PSMENU    DB      13,10,"Enter the following commands for your printer",13,10
  98.           DB      "Each command is 9 characters maximum",13,10
  99.           DB      "An ESCAPE code will be inserted before them",13,10,10
  100.           DB      "Set line spacing to 8/72 inch: $"
  101.  
  102. PS1LEN    DB      9
  103. PS1CNT    DB      0
  104. PS1BUF    DB      9 DUP(0)
  105.  
  106. PSET2     DB      13,10
  107.           DB      "Send 576 graphic characters: $"
  108.  
  109. PS2LEN    DB      9
  110. PS2CNT    DB      0
  111. PS2BUF    DB      9 DUP(0)
  112.  
  113. PSET3     DB      13,10
  114.           DB      "Set line spacing to 1/6 inch: $"
  115.  
  116. PS3LEN    DB      9
  117. PS3CNT    DB      0
  118. PS3BUF    DB      9 DUP(0)
  119.  
  120. BYTE_CNT  DW      0
  121. NEXT_PTR  DW      0
  122. BUFPTR    DW      ?
  123. SCAN1     DW      0
  124. PRT_NUM   DW      0
  125.  
  126. PGMSTR    DB      1BH,"A",8,"       "           ; Setup for Epson
  127.           DB      1BH,"*",4,64,2,"     "
  128.           DB      1BH,"2        "
  129.  
  130.           DB      1BH,"T16      "               ; Setup for Apple DMP/NEC 8023
  131.           DB      1BH,"G0576    "
  132.           DB      1BH,"B        "
  133.  
  134.           DB      1BH,"3",16,"       "          ; Setup for Gemini 10
  135.           DB      1BH,"L",64,2,"      "
  136.           DB      1BH,"2        "
  137.  
  138.           DB      1BH,"A",8,"       "           ; Setup for IBM Printer
  139.           DB      1BH,"L",64,2,"      "
  140.           DB      1BH,"2        "
  141.  
  142. PGMOTHR   DB      "          "                  ; Setup for OTHER Printer
  143.           DB      "          "
  144.           DB      "          "
  145.  
  146. PMENU     DB      13,10
  147.           DB      "Choice of printers",13,10
  148.           DB      "1) Epson FX",13,10
  149.           DB      "2) Apple DMP/NEC 8023",13,10
  150.           DB      "3) Gemini 10",13,10
  151.           DB      "4) IBM Graphics Printer",13,10
  152.           DB      "5) Other (if installed)",13,10
  153.           DB      "Enter Choice (1-5): $"
  154.  
  155. PRT_MSG   DB      13,10,10,"Printing...$"
  156.  
  157. MAC_EXT   DB      ".MAC"
  158.  
  159. OTHER     DB      "OTHER.PRT",0
  160.  
  161. MAIN:     MOV     SI,OFFSET PARAM               ; Point to Parameter String
  162.           LODSB                                 ; Read Parameter String Length
  163.           XOR     AH,AH
  164.           MOV     CX,AX
  165. MAIN00:   JCXZ    MAIN05A                       ; If Length = 0, Skip
  166.           LODSB                                 ; Strip off Leading Whitespace
  167.           DEC     CX
  168.           CMP     AL,' '
  169.           JE      MAIN00
  170.           CMP     AL,9
  171.           JE      MAIN00
  172.           CMP     AL,'/'                        ; If a Switch is Found,
  173.           JNE     MAIN05
  174.           LODSB                                 ;   Read Switch Letter
  175.           DEC     CX
  176.           AND     AL,0DFH                       ;   Convert to Upper Case
  177.           CMP     AL,'H'                        ;   If 'H', Use Hercules
  178.           JNE     MAIN01
  179.           MOV     HERC,-1
  180.           MOV     SCANCNT,4
  181.           MOV     LINLEN,720
  182.           MOV     SCRLEN,348
  183.           MOV     VIDEO,0B000H
  184.           JMP     SHORT MAIN04
  185. MAIN01:   CMP     AL,'C'                        ;   Else if 'C', Use CGA
  186.           JNE     MAIN02
  187.           MOV     HERC,0
  188.           JMP     SHORT MAIN04
  189. MAIN02:   DEC     SI                            ;   Else Interpret as Filename
  190.           DEC     CX
  191.           JMP     SHORT MAIN05
  192. MAIN04:   JCXZ    MAIN05A                       ; If Length = 0, Skip
  193.           LODSB                                 ; Strip off Leading Whitespace
  194.           DEC     CX
  195.           CMP     AL,' '
  196.           JE      MAIN04
  197.           CMP     AL,9
  198.           JE      MAIN04
  199. MAIN05:   DEC     SI                            ; ReUse Last Character
  200.           INC     CX
  201.           MOV     FILN_LEN,CL
  202.           MOV     DI,OFFSET FILN_BUF            ; Read Filename into Buffer
  203.           REP     MOVSB
  204. MAIN05A:  CMP     HERC,1                        ; If no Switch Option,
  205.           JNE     MAIN07
  206.           MOV     HERC,0
  207.           INT     11H                           ;   Test Display Adapter Type
  208.           AND     AX,30H                        ;   If Not CGA,
  209.           CMP     AX,30H
  210.           JNE     MAIN07
  211.           CONFIG  3                             ;     Configure to Full Mode
  212.           MOV     AX,0B800H                     ;     If unable to write page 1,
  213.           MOV     ES,AX
  214.           MOV     ES:[0],5AA5H
  215.           CMP     ES:[0],5AA5H
  216.           JE      MAIN06                        ;       True Monochrome
  217.           MOV     AH,9                          ;       Output Error Message
  218.           MOV     DX,OFFSET ERR_MSG
  219.           INT     21H
  220.           MOV     AX,4C01H                      ;       Exit to DOS
  221.           INT     21H
  222. MAIN06:   MOV     HERC,-1                       ;     Else Hercules Card
  223.           MOV     SCANCNT,4
  224.           MOV     LINLEN,720
  225.           MOV     SCRLEN,348
  226.           MOV     VIDEO,0B000H
  227. MAIN07:   PUSH    CS                            ; Extra Segment = Code Segment
  228.           POP     ES
  229.           MOV     AX,720                        ; Calculate LastScan
  230.           SUB     AX,SCRLEN
  231.           MOV     LASTSCAN,AX
  232.           CALL    RD_OTHER                      ; Read OTHER.PRT
  233.           MOV     BX,OFFSET BUFFER              ; Initialize Buffer Pointer
  234.           MOV     BUFPTR,BX
  235.           CMP     FILN_LEN,0                    ; If No Filename,
  236.           JNE     MAIN09
  237. MAIN08:   CALL    SET_TMOD                      ;   Set Text Mode
  238.           MOV     DX,OFFSET MENU                ;   Output Menu to Screen
  239.           MOV     AH,9
  240.           INT     21H
  241.           MOV     DX,OFFSET FILENAME            ;   Read Filename
  242.           MOV     AH,0AH
  243.           INT     21H
  244. MAIN09:   MOV     CL,FILN_LEN                   ; If no Entry,
  245.           OR      CL,CL
  246.           JNZ     MAIN10
  247. MAIN09A:  MOV     DX,OFFSET LOAD_ERR-1
  248.           JMP     MAIN43                        ;   Exit
  249. MAIN10:   CMP     CL,1                          ; If Single Character,
  250.           JNE     MAIN12
  251.           CMP     FILN_BUF[0],'"'               ;   If Quote, Use Current Data
  252.           JE      MAIN15
  253.           CMP     FILN_BUF[0],15                ;   Else if ^O,
  254.           JNE     MAIN11
  255.           CALL    PSETUP                        ;     Install OTHER Printer
  256. MAIN08A:  JMP     SHORT MAIN08
  257. MAIN11:   CMP     FILN_BUF[0],21                ;   Else if ^U,
  258.           JNE     MAIN11A
  259.           CALL    SEL_PRT                       ;     Select Printer
  260.           JMP     SHORT MAIN08
  261. MAIN11A:  CMP     FILN_BUF[0],17
  262.           JNE     MAIN11B
  263.           CALL    SET_TMOD                      ;     Select Text Mode
  264.           CALL    PRT_PIC                       ;     Print Picture
  265.           JMP     SHORT MAIN08
  266. MAIN11B:  CMP     FILN_BUF[0],5                 ;   Else if ^E,
  267.           JE      MAIN09A                       ;     Exit to DOS
  268. MAIN12:   XOR     CH,CH                         ; If no Extension,
  269.           MOV     DI,OFFSET FILN_BUF
  270.           MOV     AL,'.'
  271.           REPNE   SCASB
  272.           JE      MAIN13
  273.           MOV     SI,OFFSET MAC_EXT             ;   Append Extension ".MAC"
  274.           MOV     CX,4
  275.           REP     MOVSB
  276.           ADD     FILN_LEN,4
  277. MAIN13:   MOV     CL,FILN_LEN                   ; Copy Filename to String
  278.           XOR     CH,CH
  279.           MOV     SI,OFFSET FILN_BUF
  280.           MOV     DI,OFFSET FILN_STR
  281.           REP     MOVSB
  282.           MOV     AL,'$'                        ; Terminate Filename String
  283.           STOSB
  284.           XCHG    DI,SI                         ; Terminate Filename Buffer
  285.           MOV     AL,0
  286.           STOSB
  287.           MOV     DX,OFFSET LOAD_MSG            ; Output Loading Message
  288.           MOV     AH,9
  289.           INT     21H
  290.           CALL    OP_PICF                       ; Open Picture File
  291.           JNC     MAIN14                        ; If Error,
  292.           MOV     DX,OFFSET LOAD_ERR            ;   Output Load Error Message
  293.           JMP     MAIN43                        ;   and Done
  294. MAIN14:   CALL    GET_PIC
  295.           JNZ     MAIN08A                       ; If Keystroke, Abort Load
  296. MAIN15:   CALL    SET_GMOD                      ; Set Graphics Mode
  297.           MOV     SCAN1,0                       ; First Scan Line = 0
  298. MAIN16:   CALL    PIC_OUT                       ; Output the Picture
  299.           MOV     AH,0                          ; Get Key Stroke
  300.           INT     16H
  301.           CALL    BRK_CHK                       ; If ^C or ^Break, Abort
  302.           CMP     AH,UPARROW                    ; If UpArrw,
  303.           JNE     MAIN17
  304.           DEC     SCAN1
  305.           MOV     AX,SCAN1                      ;   Move Down One Scan Line
  306.           CMP     AX,0
  307.           JGE     MAIN16
  308.           MOV     SCAN1,0
  309.           JMP     SHORT MAIN16
  310. MAIN17:   CMP     AH,DNARROW                    ; If DnArrw,
  311.           JNE     MAIN18
  312.           INC     SCAN1                         ;   Move Up One Scan Line
  313.           MOV     AX,LASTSCAN
  314.           CMP     AX,SCAN1
  315.           JG      MAIN16
  316.           MOV     SCAN1,AX
  317.           JMP     SHORT MAIN16
  318. MAIN18:   CMP     AH,PAGEUP                     ; If PgUp,
  319.           JNE     MAIN21
  320.           MOV     BX,SCROLL
  321. MAIN19:   SUB     SCAN1,BX                      ;   Move Down Ten Scan Lines
  322.           JGE     MAIN16
  323. MAIN20:   MOV     SCAN1,0
  324.           JMP     SHORT MAIN16
  325. MAIN21:   CMP     AH,PAGEDN                     ; If PgDn,
  326.           JNE     MAIN24
  327.           MOV     BX,SCROLL
  328. MAIN22:   ADD     SCAN1,BX                      ;   Move Up Ten Scan Lines
  329.           MOV     AX,LASTSCAN
  330.           CMP     SCAN1,AX
  331.           JLE     MAIN16
  332. MAIN23:   MOV     SCAN1,AX
  333.           JMP     SHORT MAIN16
  334. MAIN24:   CMP     AH,CPAGEUP                    ; If Cntl-PgUp,
  335.           JNE     MAIN25
  336.           MOV     BX,SCRLEN                     ;   Move Up by a Half-Screen
  337.           SHR     BX,1
  338.           JMP     SHORT MAIN19
  339. MAIN25:   CMP     AH,CPAGEDN                    ; If Cntl-PgDn,
  340.           JNE     MAIN26
  341.           MOV     BX,SCRLEN                     ;   Move Down by a Half-Screen
  342.           SHR     BX,1
  343.           JMP     SHORT MAIN22
  344. MAIN26:   CMP     AH,HOME                       ; If Home,
  345.           JNE     MAIN27
  346.           MOV     SCAN1,0                       ;   Move to First Scan Line
  347.           JMP     MAIN16
  348. MAIN27:   CMP     AH,ENDKEY                     ; If End,
  349.           JNE     MAIN28
  350.           MOV     AX,LASTSCAN
  351.           MOV     SCAN1,AX                      ;   Move to Last Scan Line
  352.           JMP     MAIN16
  353. MAIN28:   CMP     AH,CHOME                      ; If Cntl-Home,
  354.           JNE     MAIN32
  355. MAIN29:   SUB     SCAN1,SCROLL                  ;   Scroll to End of Picture
  356.           CMP     SCAN1,0
  357.           JLE     MAIN20
  358.           CALL    KEY_CHK                       ;   If Keystroke, Abort
  359.           JZ      MAIN31
  360. MAIN30:   JMP     MAIN16
  361. MAIN31:   CALL    PIC_OUT
  362.           JMP     SHORT MAIN29
  363. MAIN32:   CMP     AH,CEND                       ; If Cntl-End,
  364.           JNE     MAIN34
  365. MAIN33:   MOV     AX,SCROLL
  366.           ADD     SCAN1,AX                      ;   Scroll to Top of Picture
  367.           MOV     AX,LASTSCAN
  368.           CMP     SCAN1,AX
  369.           JGE     MAIN23
  370.           CALL    KEY_CHK
  371.           JNZ     MAIN30
  372.           CALL    PIC_OUT
  373.           JMP     SHORT MAIN33
  374. MAIN34:   CMP     AH,CPRTSC                     ; If Cntl-PrtSc,
  375.           JNE     MAIN35
  376.           CALL    SET_TMOD                      ;   Select Text Mode
  377.           CALL    PRT_PIC                       ;   Print Picture
  378.           JMP     MAIN15
  379. MAIN35:   CMP     AL,'?'                        ; If '?' or ' ', Same as 'L'
  380.           JE      MAIN39
  381.           CMP     AL,' '
  382.           JE      MAIN39
  383.           AND     AL,0DFH                       ; Convert Key to Upper Case
  384.           CMP     AL,'P'                        ; If 'P', ^P or ^Q,
  385.           JE      MAIN35B
  386.           CMP     AL,16
  387.           JE      MAIN35B
  388.           CMP     AL,17
  389.           JNE     MAIN36
  390. MAIN35B:  CALL    SEL_PRT                       ;   Select Printer
  391.           JB      MAIN35A
  392.           CALL    PRT_PIC                       ;   Print Picture
  393. MAIN35A:  JMP     MAIN15
  394. MAIN36:   CMP     AL,'U'                        ; If 'U' or ^U,
  395.           JE      MAIN37
  396.           CMP     AL,21
  397.           JNE     MAIN38
  398. MAIN37:   CALL    SEL_PRT                       ;   Select Printer
  399.           JMP     MAIN15
  400. MAIN38:   CMP     AL,'H'                        ; If 'H', 'L', ' ' or '?',
  401.           JE      MAIN39
  402.           CMP     AL,'L'
  403.           JNE     MAIN40
  404. MAIN39:   JMP     MAIN08                        ;   Load Next Picture
  405. MAIN40:   CMP     AL,'O'                        ; If 'O' or ^O,
  406.           JE      MAIN41
  407.           CMP     AL,15
  408.           JNE     MAIN42
  409. MAIN41:   CALL    PSETUP                        ;   Install Printer
  410.           JMP     MAIN15
  411. MAIN42:   MOV     DX,OFFSET LOAD_ERR-1
  412.           CMP     AL,'E'                        ; If 'E' or ESC, Exit
  413.           JE      MAIN43
  414.           CMP     AL,5
  415.           JE      MAIN43
  416.           CMP     AL,1BH
  417.           JE      MAIN43
  418.           JMP     MAIN16                        ; Else Ignore
  419. MAIN43:   PUSH    DX
  420.           CALL    SET_TMOD                      ; Set Text Mode
  421.           POP     DX                            ; Output Termination Message
  422.           MOV     AH,9
  423.           INT     21H
  424.           MOV     AX,4C00H                      ; Exit to DOS
  425.           INT     21H
  426.  
  427. GET_PIC:  CALL    RD_PICF                       ; Read First Block
  428.           JNZ     GET_PIC8                      ; If Keystroke, Abort Load
  429.           MOV     SI,OFFSET IOBUF[1]            ; Output Picture Name
  430.           LODSB
  431.           XOR     AH,AH
  432.           MOV     CX,AX
  433. GET_PIC1: LODSB
  434.           MOV     DL,AL
  435.           MOV     AH,2
  436.           INT     21H
  437.           LOOP    GET_PIC1
  438.           MOV     NEXT_PTR,640                  ; Skip First 640 Bytes
  439.           MOV     CX,720                        ; Line Count = 720
  440.           MOV     BX,BUFPTR                     ; Point to Buffer
  441. GET_PIC2: MOV     SI,0                          ; Point to Beginning of Buffer
  442.           MOV     BYTE_CNT,0                    ; Byte Count = 0
  443.           PUSH    CX                            ; Save Count
  444. GET_PIC3: CALL    GET_BYTE                      ; Get a Byte from the File
  445.           JNZ     GET_PIC7                      ; If Keystroke, Abort Load
  446.           CMP     AL,0                          ; If Byte >= 0,
  447.           JL      GET_PIC5
  448.           XOR     AH,AH                         ;   SubCount = Byte + 1
  449.           MOV     CX,AX
  450.           INC     CX
  451. GET_PIC4: CALL    GET_STR                       ;   Read String into Buffer
  452.           JNZ     GET_PIC7                      ;   If Keystroke, Abort Load
  453.           JMP     SHORT GET_PIC6
  454. GET_PIC5: MOV     CL,AL                         ; Else SubCount = 101H - Byte
  455.           XOR     CH,CH
  456.           MOV     AX,101H
  457.           SUB     AX,CX
  458.           MOV     CX,AX
  459.           CALL    GET_BYTE                      ;   Read Byte
  460.           JNZ     GET_PIC7                      ;   If Keystroke, Abort Load
  461.           PUSH    CX                            ;   Fill Buffer with Byte
  462.           PUSH    DI
  463.           MOV     DI,SI
  464.           ADD     DI,BX
  465.           REP     STOSB
  466.           POP     DI
  467.           POP     CX
  468.           ADD     BYTE_CNT,CX
  469.           ADD     SI,CX
  470. GET_PIC6: MOV     AX,BYTE_CNT                   ; Repeat until a Full Line
  471.           CMP     AX,72                         ;   has been read in
  472.           JL      GET_PIC3
  473.           POP     CX                            ; Repeat until all Lines
  474.           ADD     BX,72                         ;   have been read in
  475.           LOOP    GET_PIC2
  476.           XOR     AH,AH                         ; Reset Abort Flag
  477.           PUSH    CX
  478. GET_PIC7: POP     CX
  479. GET_PIC8: RET                                   ; Done
  480.  
  481. GET_STR:  PUSH    CX                            ; Save Registers
  482.           PUSH    DI
  483.           PUSH    SI
  484.           MOV     DI,SI                         ; Read Data to End-of-Input
  485.           ADD     DI,BX
  486.           MOV     SI,OFFSET IOBUF
  487.           ADD     SI,NEXT_PTR
  488.           MOV     AX,8192
  489.           SUB     AX,NEXT_PTR
  490.           CMP     AX,CX
  491.           JGE     GET_STR1
  492.           SUB     CX,AX
  493.           PUSH    CX
  494.           MOV     CX,AX
  495.           ADD     BYTE_CNT,CX
  496.           ADD     NEXT_PTR,CX
  497.           REP     MOVSB
  498.           CALL    RD_PICF                       ; Read Next Block
  499.           POP     CX
  500.           JNZ     GET_STR2                      ; If Keystroke, Abort Load
  501.           MOV     SI,OFFSET IOBUF               ; Point to First Byte
  502. GET_STR1: ADD     BYTE_CNT,CX                   ; Read Remainder of String
  503.           ADD     NEXT_PTR,CX
  504.           REP     MOVSB
  505.           XOR     AH,AH
  506. GET_STR2: POP     SI                            ; Restore Registers
  507.           POP     DI
  508.           POP     CX
  509.           PUSHF
  510.           ADD     SI,CX
  511.           POPF
  512.           RET                                   ; Done
  513.  
  514. GET_BYTE: PUSH    SI                            ; Save Register
  515.           MOV     SI,NEXT_PTR                   ; Get Byte Pointer
  516.           CMP     SI,8192                       ; If End of Buffer,
  517.           JL      GET_BYT1
  518.           CALL    RD_PICF                       ;   Read Next Block
  519.           MOV     SI,0                          ;   Point to First Byte
  520. GET_BYT1: MOV     AL,IOBUF[SI]                  ; Get Byte from Buffer
  521.           INC     NEXT_PTR                      ; Point to Next Byte
  522.           PUSH    AX
  523.           CALL    KEY_CHK                       ; Check for Keystroke
  524.           POP     AX
  525.           POP     SI                            ; Restore Register
  526.           RET                                   ; Done
  527.  
  528. PSETUP:   PUSH    AX                            ; Save Registers
  529.           PUSH    BX
  530.           PUSH    CX
  531.           PUSH    DX
  532.           PUSH    SI
  533.           PUSH    DI
  534.           CALL    SET_TMOD                      ; Set Text Mode
  535.           MOV     AX,0600H                      ; Clear Screen
  536.           MOV     BH,7
  537.           COORD   CX,0,0
  538.           COORD   DX,24,79
  539.           INT     10H
  540.           MOV     DX,OFFSET PSMENU              ; Output Printer Setup Menu
  541.           MOV     AH,9
  542.           INT     21H
  543.           MOV     DX,OFFSET PS1LEN              ; Read Response #1
  544.           MOV     AH,0AH
  545.           INT     21H
  546.           MOV     AL,PS1CNT                     ; Terminate PS1
  547.           MOV     AH,0
  548.           MOV     SI,AX
  549.           MOV     PS1BUF[SI],' '
  550.           MOV     DX,OFFSET PSET2               ; Output Printer Setup Msg #2
  551.           MOV     AH,9
  552.           INT     21H
  553.           MOV     DX,OFFSET PS2LEN              ; Read Response #2
  554.           MOV     AH,0AH
  555.           INT     21H
  556.           MOV     AL,PS2CNT                     ; Terminate PS2
  557.           MOV     AH,0
  558.           MOV     SI,AX
  559.           MOV     PS2BUF[SI],' '
  560.           MOV     DX,OFFSET PSET3               ; Output Printer Setup Msg #3
  561.           MOV     AH,9
  562.           INT     21H
  563.           MOV     DX,OFFSET PS3LEN              ; Read Response #3
  564.           MOV     AH,0AH
  565.           INT     21H
  566.           MOV     AL,PS3CNT                     ; Terminate PS3
  567.           MOV     AH,0
  568.           MOV     SI,AX
  569.           MOV     PS3BUF[SI],' '
  570.           MOV     DI,0
  571.           MOV     SI,2
  572.           MOV     CX,9
  573.           MOV     PGMOTHR[DI],1BH               ; Copy Strings to PGMOTHR
  574.           INC     DI
  575. PSETUP1:  MOV     AL,PS1LEN[SI]
  576.           MOV     PGMOTHR[DI],AL
  577.           INC     SI
  578.           INC     DI
  579.           LOOP    PSETUP1
  580.           MOV     DI,10
  581.           MOV     SI,2
  582.           MOV     CX,9
  583.           MOV     PGMOTHR[DI],1BH
  584.           INC     DI
  585. PSETUP2:  MOV     AL,PS2LEN[SI]
  586.           MOV     PGMOTHR[DI],AL
  587.           INC     SI
  588.           INC     DI
  589.           LOOP    PSETUP2
  590.           MOV     DI,20
  591.           MOV     SI,2
  592.           MOV     CX,9
  593.           MOV     PGMOTHR[DI],1BH
  594.           INC     DI
  595. PSETUP3:  MOV     AL,PS3LEN[SI]
  596.           MOV     PGMOTHR[DI],AL
  597.           INC     SI
  598.           INC     DI
  599.           LOOP    PSETUP3
  600.           CALL    WR_OTHER                      ; Write Install Info to File
  601.           POP     DI                            ; Restore Registers
  602.           POP     SI
  603.           POP     DX
  604.           POP     CX
  605.           POP     BX
  606.           POP     AX
  607.           RET                                   ; Done
  608.  
  609. SEL_PRT:  PUSH    AX                            ; Save Registers
  610.           PUSH    BX
  611.           PUSH    DX
  612.           CALL    SET_TMOD                      ; Set Text Mode
  613.           MOV     DX,OFFSET PMENU               ; Output Printer Menu
  614.           MOV     AH,9
  615.           INT     21H
  616.           MOV     AH,0                          ; Get Key Stroke
  617.           INT     16H
  618.           CALL    BRK_CHK                       ; If ^C or ^Break, Abort
  619.           CMP     AL,'1'                        ; If Valid Entry,
  620.           JL      SEL_PRT2
  621.           CMP     AL,'5'
  622.           JG      SEL_PRT2
  623.           SUB     AL,'1'
  624.           CBW
  625.           CMP     AX,4                          ;   If Other Selected,
  626.           JNE     SEL_PRT1
  627.           CMP     PGMOTHR,' '                   ;     and Other not Installed,
  628.           JE      SEL_PRT2                      ;       Error
  629. SEL_PRT1: MOV     PRT_NUM,AX                    ;   Save it
  630.           CLC                                   ;   Reset Error Flag
  631.           JMP     SHORT SEL_PRT3
  632. SEL_PRT2: MOV     AH,2                          ; Else Beep
  633.           MOV     DL,7
  634.           INT     21H
  635.           STC                                   ;   Set Error Flag
  636. SEL_PRT3: POP     DX                            ; Restore Registers
  637.           POP     BX
  638.           POP     AX
  639.           RET                                   ; Done
  640.  
  641. PRT_PIC:  PUSH    AX                            ; Save Registers
  642.           PUSH    BX
  643.           PUSH    CX
  644.           PUSH    DX
  645.           PUSH    SI
  646.           PUSH    DI
  647.           MOV     DX,OFFSET PRT_MSG             ; Output Printer Menu
  648.           MOV     AH,9
  649.           INT     21H
  650.           MOV     AX,PRT_NUM                    ; Point to Setup String
  651.           MOV     SI,30
  652.           MUL     SI
  653.           ADD     AX,OFFSET PGMSTR
  654.           MOV     BX,AX
  655.           MOV     CX,10                         ; Set to 8/72" Line Spacing
  656.           MOV     SI,0
  657.           CALL    PARMOUT
  658.           MOV     CX,720/8                      ; Printer Line Count
  659.           MOV     BX,BUFPTR                     ; Point to Buffer
  660. PRT_PIC1: PUSH    CX
  661.           PUSH    BX
  662.           MOV     AX,PRT_NUM                    ; Prepare Printer for Graphics
  663.           MOV     SI,30
  664.           MUL     SI
  665.           ADD     AX,OFFSET PGMSTR
  666.           MOV     BX,AX
  667.           MOV     CX,10
  668.           MOV     SI,10
  669.           CALL    PARMOUT
  670.           POP     BX                            ; Get Buffer Pointer
  671.           PUSH    BX
  672.           MOV     CX,72                         ; Printer Character Count
  673.           MOV     SI,0                          ; Pointer = 0
  674. PRT_PIC2: PUSH    CX
  675.           PUSH    BX
  676.           PUSH    SI
  677.           MOV     CX,8                          ; 8 Scan Lines per Printer Line
  678.           MOV     DH,80H
  679. PRT_PIC3: PUSH    CX
  680.           PUSH    BX
  681.           MOV     AL,0
  682.           MOV     CX,8
  683.           MOV     DL,80H
  684. PRT_PIC4: MOV     AH,[BX][SI]
  685.           AND     AH,DH
  686.           CMP     AH,0
  687.           JE      PRT_PIC5
  688.           OR      AL,DL
  689. PRT_PIC5: SHR     DL,1
  690.           ADD     BX,72
  691.           LOOP    PRT_PIC4
  692.           PUSH    DX
  693.           CALL    PRT_OUT                       ; Output Graphics to Printer
  694.           POP     DX
  695.           POP     BX
  696.           POP     CX
  697.           SHR     DH,1
  698.           LOOP    PRT_PIC3                      ; Next Dot Position
  699.           POP     SI
  700.           POP     BX
  701.           POP     CX
  702.           INC     SI
  703.           LOOP    PRT_PIC2                      ; Next Character Position
  704.           MOV     AL,13                         ; Send CRLF to Printer
  705.           CALL    PRT_CHR
  706.           MOV     AL,10
  707.           CALL    PRT_CHR
  708.           POP     BX
  709.           ADD     BX,576
  710.           POP     CX
  711.           CALL    KEY_CHK                       ; If Keystroke, Abort
  712.           LOOPZ   PRT_PIC1                      ; Next Printer Line
  713.           MOV     AX,PRT_NUM
  714.           MOV     SI,30
  715.           MUL     SI
  716.           ADD     AX,OFFSET PGMSTR
  717.           MOV     BX,AX
  718.           MOV     CX,10                         ; Set to 1/6" Line Spacing
  719.           MOV     SI,20
  720.           CALL    PARMOUT
  721.           MOV     AL,13                         ; Output CR to Printer
  722.           CALL    PRT_CHR
  723.           MOV     AL,12                         ; Output FF to Printer
  724.           CALL    PRT_CHR
  725.           POP     DI                            ; Restore Registers
  726.           POP     SI
  727.           POP     DX
  728.           POP     CX
  729.           POP     BX
  730.           POP     AX
  731.           RET                                   ; Done
  732.  
  733. PARMOUT:  MOV     AL,[BX][SI]                   ; Output Parameter String
  734.           CMP     AL,' '                        ;   to Printer
  735.           JE      PARMOUT1
  736.           CALL    PRT_CHR
  737.           INC     SI
  738.           LOOP    PARMOUT
  739. PARMOUT1: RET
  740.  
  741. PRT_OUT:  PUSH    AX                            ; Save Registers
  742.           PUSH    BX
  743.           PUSH    CX
  744.           PUSH    DX
  745.           MOV     BX,PRT_NUM                    ; If Apple/NEC Printer,
  746.           CMP     BX,1
  747.           JNE     PRT_OUT2
  748.           MOV     CX,8                          ;   Transpose Data
  749. PRT_OUT1: RCR     AL,1
  750.           RCL     AH,1
  751.           LOOP    PRT_OUT1
  752.           MOV     AL,AH
  753. PRT_OUT2: CALL    PRT_CHR                       ; Output Data to Printer
  754.           POP     DX                            ; Restore Registers
  755.           POP     CX
  756.           POP     BX
  757.           POP     AX
  758.           RET                                   ; Done
  759.  
  760. PRT_CHR:  PUSH    AX                            ; Save Registers
  761.           PUSH    DX
  762.           MOV     DX,0                          ; Output Character to LPT1:
  763.           MOV     AH,0
  764.           INT     17H
  765.           AND     AL,0A9H                       ; If Error, Say So
  766.           JNZ     PRT_CHR1
  767.           CLC                                   ; Clear Error Indicator
  768.           POP     DX                            ; Restore Registers
  769.           POP     AX
  770.           RET                                   ; Done
  771. PRT_CHR1: STC                                   ; Set Error Indicator
  772.           POP     DX                            ; Restore Registers
  773.           POP     AX
  774.           RET                                   ; Done
  775.  
  776. PIC_OUT:  PUSH    AX                            ; Save Registers
  777.           PUSH    BX
  778.           PUSH    CX
  779.           PUSH    DX
  780.           PUSH    SI
  781.           PUSH    DI
  782.           PUSH    BP
  783.           PUSH    ES
  784.           MOV     AX,VIDEO                      ; Point to Video Segment
  785.           MOV     ES,AX
  786.           COORD   BP,0,0                        ; Point to (0,0) in Video
  787.           MOV     AX,SCAN1                      ; Point to First Scan Line
  788.           MOV     SI,72
  789.           MUL     SI
  790.           ADD     AX,BUFPTR
  791.           MOV     BX,AX
  792.           MOV     AX,SCRLEN                     ; Count = Number of Scan Groups
  793.           DIV     SCANCNT
  794.           MOV     CX,AX
  795. PIC_OUT1: PUSH    CX
  796.           MOV     SI,0
  797.           MOV     DI,0
  798.           MOV     CX,72
  799. PIC_OUT2: MOV     AL,[BX][SI]                   ; Output Byte 0 to Video 1
  800.           XOR     AL,0FFH
  801.           MOV     ES:[BP][DI],AL
  802.           MOV     AL,[BX][SI][72]               ; Output Byte 72 to Video 2
  803.           XOR     AL,0FFH
  804.           MOV     ES:[BP][DI][2000H],AL
  805.           CMP     HERC,0
  806.           JE      PIC_OUT3
  807.           MOV     AL,[BX][SI][144]              ; Output Byte 144 to Video 3
  808.           XOR     AL,0FFH
  809.           MOV     ES:[BP][DI][4000H],AL
  810.           MOV     AL,[BX][SI][216]              ; Output Byte 216 to Video 4
  811.           XOR     AL,0FFH
  812.           MOV     ES:[BP][DI][6000H],AL
  813. PIC_OUT3: INC     SI                            ; Repeat for Whole Line
  814.           INC     DI
  815.           LOOP    PIC_OUT2
  816.           MOV     AL,SCANCNT                    ; Repeat for Whole Screen
  817.           MOV     AH,72
  818.           MUL     AH
  819.           ADD     BX,AX
  820.           MOV     AX,LINLEN
  821.           MOV     CL,3
  822.           SHR     AX,CL
  823.           ADD     BP,AX
  824.           POP     CX
  825.           LOOP    PIC_OUT1
  826.           POP     ES                            ; Restore Registers
  827.           POP     BP
  828.           POP     DI
  829.           POP     SI
  830.           POP     DX
  831.           POP     CX
  832.           POP     BX
  833.           POP     AX
  834.           RET                                   ; Done
  835.  
  836. OP_PICF:  PUSH    DX                            ; Save Register
  837.           MOV     DX,OFFSET FILN_BUF            ; Open File For Reading
  838.           MOV     AX,3D00H
  839.           INT     21H
  840.           MOV     HANDLE,AX                     ; Save Handle
  841.           POP     DX                            ; Restore Register
  842.           RET                                   ; Done
  843.  
  844. RD_PICF:  PUSH    BX                            ; Save Registers
  845.           PUSH    CX
  846.           PUSH    DX
  847.           MOV     AH,3FH                        ; Read a Block to the IO Buffer
  848.           MOV     DX,OFFSET IOBUF
  849.           MOV     CX,8192
  850.           MOV     BX,HANDLE
  851.           INT     21H
  852.           MOV     NEXT_PTR,0                    ; Set Pointer to Start of Buffer
  853.           CALL    KEY_CHK                       ; Check for Keystroke
  854.           POP     DX                            ; Restore Registers
  855.           POP     CX
  856.           POP     BX
  857.           RET                                   ; Done
  858.  
  859. CL_PICF:  PUSH    BX                            ; Save Register
  860.           MOV     BX,HANDLE                     ; Close File
  861.           MOV     AX,3E00H
  862.           INT     21H
  863.           POP     BX                            ; Restore Register
  864.           RET                                   ; Done
  865.  
  866. RD_OTHER: PUSH    BX                            ; Save Registers
  867.           PUSH    CX
  868.           PUSH    DX
  869.           MOV     AX,3D00H                      ; Open OTHER.PRT
  870.           MOV     DX,OFFSET OTHER
  871.           INT     21H
  872.           MOV     BX,AX                         ; Save File Handle
  873.           JC      NO_OTHER
  874.           MOV     AH,3FH                        ; Read Printer Info from File
  875.           MOV     CX,30
  876.           MOV     DX,OFFSET PGMOTHR
  877.           INT     21H
  878.           MOV     AH,3EH                        ; Close OTHER.PRT
  879.           INT     21H
  880. NO_OTHER: POP     DX                            ; Restore Registers
  881.           POP     CX
  882.           POP     BX
  883.           RET                                   ; Done
  884.  
  885. WR_OTHER: PUSH    BX                            ; Save Registers
  886.           PUSH    CX
  887.           PUSH    DX
  888.           MOV     AH,3CH                        ; Create OTHER.PRT
  889.           MOV     CX,0
  890.           MOV     DX,OFFSET OTHER
  891.           INT     21H
  892.           MOV     BX,AX                         ; Save File Handle
  893.           MOV     AH,40H                        ; Write Printer Info to File
  894.           MOV     CX,30
  895.           MOV     DX,OFFSET PGMOTHR
  896.           INT     21H
  897.           MOV     AH,3EH                        ; Close OTHER.PRT
  898.           INT     21H
  899.           POP     DX                            ; Restore Registers
  900.           POP     CX
  901.           POP     BX
  902.           RET                                   ; Done
  903.  
  904. KEY_CHK:  PUSH    AX                            ; Save Register
  905.           MOV     AH,1                          ; If Keystroke,
  906.           INT     16H
  907.           JZ      KEY_CHK1
  908.           MOV     AH,0                          ;   Read the Key
  909.           INT     16H
  910.           CALL    BRK_CHK                       ;   If ^C or ^Break, Abort
  911. KEY_CHK1: POP     AX                            ; Restore Register
  912.           RET                                   ; Done
  913.  
  914. BRK_CHK:  CMP     AL,3                          ;     If ^C or ^Break,
  915.           JE      BRK_CHK1
  916.           CMP     AX,0
  917.           JNE     BRK_CHK2
  918. BRK_CHK1: CALL    SET_TMOD                      ;       Select Text Mode
  919.           MOV     AX,4C02H                      ;       Exit to DOS
  920.           INT     21H
  921. BRK_CHK2: RET
  922.  
  923. SET_GMOD: CMP     HERC,0                        ; If Hercules,
  924.           JE      SET_GMD1
  925.           MOV     AL,2                          ;   Mode = Graphics
  926.           MOV     SI,OFFSET GMODE
  927.           MOV     BX,0
  928.           MOV     CX,16384
  929.           CALL    SET_MODE
  930.           JMP     SHORT SET_GMD2
  931. SET_GMD1: MOV     AX,0006H                      ; Else Set Hi-Res Graphics Mode
  932.           INT     10H
  933.           MOV     AX,0600H                      ;   Clear Screen
  934.           MOV     BH,0
  935.           COORD   CX,0,0
  936.           COORD   DX,24,79
  937.           INT     10H
  938. SET_GMD2: RET                                   ; Done
  939.  
  940. SET_TMOD: CMP     HERC,0                        ; If Hercules,
  941.           JE      SET_TMD1
  942.           MOV     AL,20H                        ;   Mode = Text
  943.           MOV     SI,OFFSET TMODE
  944.           MOV     BX,' '+7*256
  945.           MOV     CX,2000
  946.           CALL    SET_MODE
  947.           JMP     SHORT SET_TMD2
  948. SET_TMD1: MOV     AX,0002H                      ; Else Set 80x25 Mono Mode
  949.           INT     10H
  950.           MOV     AX,0600H                      ;   Clear Screen
  951.           MOV     BH,7
  952.           COORD   CX,0,0
  953.           COORD   DX,24,79
  954.           INT     10H
  955. SET_TMD2: MOV     AH,2                          ; Home Cursor
  956.           MOV     BH,0
  957.           MOV     DX,0
  958.           INT     10H
  959.           RET                                   ; Done
  960.  
  961. SET_MODE: PUSH    ES                            ; Save Registers
  962.           PUSH    AX
  963.           PUSH    BX
  964.           PUSH    CX
  965.           MOV     DX,BIOS
  966.           MOV     ES,DX
  967.           MOV     DX,3B8H                       ; Set Display Mode of Operation
  968.           OUT     DX,AL
  969.           MOV     ES:CRTMODE,AL
  970.           MOV     DX,3B4H                       ; Point to Index Register
  971.           MOV     CX,12                         ; Parameter Count = 12
  972.           XOR     AH,AH                         ; First Parameter = 0
  973. SET_MOD1: MOV     AL,AH                         ; Set up Parameter Number
  974.           OUT     DX,AL
  975.           INC     DX                            ; Point to Data Register
  976.           LODSB                                 ; Read Parameter
  977.           OUT     DX,AL                         ; Output Paramter to Video
  978.           INC     AH                            ; Next Parameter
  979.           DEC     DX                            ; Point to Index Register
  980.           LOOP    SET_MOD1                      ; Repeat for all Parameters
  981.           MOV     AX,VIDEO                      ; Clear Screen
  982.           MOV     ES,AX
  983.           XOR     DI,DI
  984.           POP     CX                            ; Restore Registers
  985.           POP     AX
  986.           CLD
  987.           REP     STOSW
  988.           POP     AX
  989.           OR      AL,8
  990.           MOV     DX,BIOS
  991.           MOV     ES,DX
  992.           MOV     DX,3B8H                       ; Activate the Screen
  993.           OUT     DX,AL
  994.           MOV     ES:CRTMODE,AL
  995.           POP     ES                            ; Restore Registers
  996.           RET                                   ; Done
  997.  
  998. IOBUF     LABEL   BYTE
  999.  
  1000. CODE      ENDS
  1001.  
  1002. END       START
  1003.